package com.example.demo.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;


@WebFilter(
        urlPatterns = "/*",  // 拦截所有请求
        initParams = {
                @WebInitParam(name = "loginPage", value = "/login.html")  // 登录页面路径（与login.html路径一致）
        }
)
public class AuthorityFilter implements Filter {

    private String loginPage;  // 登录页面路径（如/login.html）

    public AuthorityFilter() {
        // 无参构造
    }

    @Override
    public void init(FilterConfig fConfig) throws ServletException {
        // 从初始化参数中获取登录页面路径（默认/login.html）
        loginPage = fConfig.getInitParameter("loginPage");
        if (loginPage == null) {
            loginPage = "/login.html";  // 兜底默认值
        }
    }

    @Override
    public void destroy() {
        // 过滤器销毁时释放资源（无特殊资源需释放时留空）
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        // 转换为HTTP请求/响应对象
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        // 获取请求路径（去除上下文路径）
        String path = req.getServletPath();  // 例如：/login.html、/UserServlet 等

        // ------------------------ 放行逻辑 ------------------------
        // 1. 放行登录页面（如/login.html）
        if (path.equals(loginPage)) {
            chain.doFilter(request, response);
            return;
        }

        // 2. 放行登录请求（UserServlet?type=login）
        if ("/UserServlet".equals(path) && "type=login".equals(req.getQueryString())) {
            chain.doFilter(request, response);
            return;
        }

        // 3. 放行静态资源（与login.html依赖的资源路径一致）
        if (path.startsWith("/css/") ||
                path.startsWith("/js/") ||
                path.startsWith("/images/") ||
                path.startsWith("/static/")) {
            chain.doFilter(request, response);
            return;
        }

        // 4. 放行验证码请求（与ValidateCodeServlet的@WebServlet路径一致）
        if (path.equals("/ValidateCodeServlet")) {
            chain.doFilter(request, response);
            return;
        }

        // ------------------------ 登录状态校验 ------------------------
        HttpSession session = req.getSession(false);  // 不创建新session
        if (session == null || session.getAttribute("user") == null) {
            // 未登录：重定向到登录页面
            resp.sendRedirect(req.getContextPath() + loginPage);
            return;
        }

        // 在doFilter方法中确保放行路径配置正确
        if (path.startsWith("/manage/")) {
            chain.doFilter(request, response);
            return;
        }

        // 已登录：继续执行后续过滤器/目标资源
        chain.doFilter(request, response);
    }
}